// import com.alibaba.druid.sql.ast.SQLDataType;
// import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
// import com.alibaba.druid.sql.ast.SQLParameter;
// import com.alibaba.druid.sql.ast.SQLStatement;

// import java.util.ArrayList;
// import java.util.List;
#include "OracleFunctionDataType.h"
#include "../../../ast/SQLDataType.h"
#include "../../../ast/SQLParameter.h"
#include "../../../ast/SQLStatement.h"

OracleFunctionDataType::OracleFunctionDataType()
{
  parameters = std::make_shared<std::list<SQLParameter_ptr>>();
}
BOOL_ptr OracleFunctionDataType::isStatic()
{
  return isStatic_;
}

void OracleFunctionDataType::setStatic(BOOL_ptr aStatic)
{
  isStatic_ = aStatic;
}

SQLParameter_list_ptr OracleFunctionDataType::getParameters()
{
  return parameters;
}

SQLDataType_ptr OracleFunctionDataType::getReturnDataType()
{
  return returnDataType;
}

void OracleFunctionDataType::setReturnDataType(SQLDataType_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(OracleFunctionDataType));
  }
  this->returnDataType = x;
}

SQLObject_ptr OracleFunctionDataType::clone()
{
  SQLObject_ptr clone_tmp = std::shared_ptr<OracleFunctionDataType>(new OracleFunctionDataType());
  std::shared_ptr<OracleFunctionDataType> x = std::dynamic_pointer_cast<OracleFunctionDataType>(clone_tmp);
  // OracleFunctionDataType x = new OracleFunctionDataType();
  cloneTo(x);

  x->isStatic_ = isStatic_;
  if (returnDataType != nullptr)
  {
    x->setReturnDataType(std::dynamic_pointer_cast<SQLDataType>(returnDataType->clone()));
  }
  for (SQLParameter_ptr parameter : *parameters)
  {
    SQLParameter_ptr p2 = std::dynamic_pointer_cast<SQLParameter>(parameter->clone());
    p2->setParent(x);
    x->parameters->push_back(p2);
  }

  return x;
}

SQLStatement_ptr OracleFunctionDataType::getBlock()
{
  return block;
}

void OracleFunctionDataType::setBlock(SQLStatement_ptr block)
{
  if (block != nullptr)
  {
    block->setParent( SharedObject(OracleFunctionDataType));
  }
  this->block = block;
}
